//!导入所需模块

import axios, { type InternalAxiosRequestConfig, type AxiosError, type AxiosRequestConfig } from 'axios'
import { method } from 'lodash';

//!拓展配置项：为AxiosRequestConfig 增加 donNotShowLoading 字段，用于控制是否显示加载提示
interface AxiosRequestConfigEx extends AxiosRequestConfig {
  donNotShowLoading?: boolean
};
//!ResType:通用返回格式，包含code（状态码）、data（数据体）、msg（提示信息）
export type ResType<T = unknown> = {
  code: string;
  data: T;
  msg: string;
};

//!PageDataType:用于分页数据类型，例如：列表、分页信息
export type PageDataType<T> = {
  list: T[];
  pageNum: number;
  pageSize: number;
  total: number;
};
//!RolesType:定义角色实体字段，例如id、name、status等
export type RolesType = {
  code: string,
  createTime?: string;
  id?: number;
  name: string;
  sort: number;
  status: number;
};

//!创建 Axios 实例
const instance = axios.create({
  baseURL: 'http://localhost:8989',
  timeout: 2000
});

//!http request 请求拦截器----request.use: 请求前的拦截逻辑
instance.interceptors.request.use((config: InternalAxiosRequestConfig) => {
  //设置请求头
  config.headers.set('Content-Type', 'application/json');
  if (config.method == 'post') {
    config.data = JSON.stringify(config.data)
  };
  return config;
}, (error: AxiosError) => {
  Promise.reject(error);
});

//!http response 响应拦截器----response.use: 响应后的拦截逻辑
instance.interceptors.response.use((response) => {
  return response.status == 200 ? Promise.resolve(response) : Promise.reject(response);
}, (error) => {
  const { response } = error;
  errorHanld(response.status, response.info);
});


//!失败状态码
const errorHanld = (status: number, info: string) => {
  switch (status) {
    case 400:
      console.log('语义有误');
      break;
    case 401:
      console.log('服务器认证');
      window.location.href = '/login'; //如果是401，可能是未授权，跳转到登录页
      break;
    case 402:
      console.log('服务器拒绝访问');
      break;
    case 403:
      console.log('地址有误');
      break;
    case 500:
      console.log('服务器遇到意外');
      break;
    case 502:
      console.log('服务器无法响应');
      break;
    default:
      console.log(info);
      break;
  }
};


//!封装服务请求

export const service = <T = unknown>(config: AxiosRequestConfigEx): Promise<ResType<T>> => {
  //instance.request: 使用 axios 的实例方法发送请求
  return instance.request<ResType<T>>(config).then((response) => {
    return response.data //response.data: 返回解析后的数据体
  }).catch((error) => {
    console.error(error);;
    throw error;
  });
};


//!get请求 角色分页列表
interface GetRolesPageparams {
  pageNum: number,
  pageSize: number
};

export const requestGetRolesPage = (params: GetRolesPageparams) => {
  return instance.request({
    method: 'GET',   //指定请求方法
    url: "/roles/page", //请求的url
    params: params, //查询参数
  }).then((response) => {
    return response.data;
  }).catch((error) => {
    console.error(error);
  })
};

//!post添加数据 角色的增加功能

export const addRole = (data: RolesType) => {
  return service({
    method: 'POST',
    url: '/roles',
    data,
  });
  // return instance.request({
  //   method: 'PUT',   //指定请求方法
  //   url: `/roles`, //请求的url
  //   data  //查询参数
  // }).then((response) => {
  //   return response.data;
  // }).catch((error) => {
  //   console.error(error);
  // })
};


//!put修改数据 角色的修改功能
export const editRole = (roleId: string, data: Partial<RolesType>) => {
  service({
    method: 'PUT',
    url: `/roles/${roleId}`,
    data,
  });
  // return instance.request({
  //   method: 'PUT',   //指定请求方法
  //   url: `/roles/${roleId}`, //请求的url
  //   data  //查询参数
  // }).then((response) => {
  //   return response.data;
  // }).catch((error) => {
  //   console.error(error);
  // })
};


//!patch修改角色状态 角色的状态是否禁用
export const editRolesStatus = (roleId: string, status: number) => {
  return service({
    method: "PATCH",
    url: `/roles/${roleId}/status`,
    params: { status },
  });
  // return instance.request({
  //   method: "PATCH",
  //   url: `/roles/${roleId}/status`,
  //   params: { status },
  // }).then((response) => {
  //   return response.data;
  // }).catch((error) => {
  //   console.error(error);
  // })
};


//!delete删除角色
export const deRole = (id: string) => {
  service({
    method: 'DELETE',
    url: `/roles/${id}`
  });

  // instance.request({
  //   method: 'DELETE',
  //   url: `/roles/${id}`
  // })
  //   .then((response) => { return response.data })
  //   .catch((error) => { console.error(error) });
}
